library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ───────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.3     ✓ dplyr   1.0.7
✓ tidyr   1.1.3     ✓ stringr 1.4.0
✓ readr   2.0.1     ✓ forcats 0.5.1
── Conflicts ──────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(janitor)

Attaching package: ‘janitor’

The following objects are masked from ‘package:stats’:

    chisq.test, fisher.test
library(readODS)
library(httr)
library(here)
here() starts at /Users/tomdavie/Documents/GitHub/ev_climate_change_project
library(data.table)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.14.0 using 1 threads (see ?getDTthreads).  Latest news: r-datatable.com
**********
This installation of data.table has not detected OpenMP support. It should still work but in single-threaded mode.
This is a Mac. Please read https://mac.r-project.org/openmp/. Please engage with Apple and ask them for support. Check r-datatable.com for updates, and our Mac instructions here: https://github.com/Rdatatable/data.table/wiki/Installation. After several years of many reports of installation problems on Mac, it's time to gingerly point out that there have been no similar problems on Windows or Linux.
**********

Attaching package: ‘data.table’

The following objects are masked from ‘package:dplyr’:

    between, first, last

The following object is masked from ‘package:purrr’:

    transpose
library(sf)
Linking to GEOS 3.8.1, GDAL 3.2.1, PROJ 7.2.1
library(leaflet)
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
read_ods(here("raw_data/electric-vehicle-charging-device-statistics-june-2021.ods"))
getwd()
APE <- read_ods("raw_data/APE_site_data_tables.ods", sheet = 2)
NO2 <- read_ods("raw_data/NO2_tables.ods")
registry <- GET("http://chargepoints.dft.gov.uk/api/retrieve/registry/format/csv/") %>% 
  content()
type <- GET("http://chargepoints.dft.gov.uk/api/retrieve/type/format/csv/") %>% 
  content()
read_csv("Documents/GitHub/ev_climate_change_project/raw_data/no2_by_grid_2019.csv")
air_pollution_cap <- GET("https://uk-air.defra.gov.uk/data/sos/service?service=AQD&request=GetCapabilities")
air_pollution_cap <- rbindlist(air_pollution$content, fill = TRUE)
air_pollution_cap <- unnest(air_pollution_cap)
air_pollution <- GET("https://uk-air.defra.gov.uk/data/sos/service?service=SOS&version=2.0.0&request=GetObserved&observedProperty=http://dd.eionet.europa.eu/vocabulary/aq/pollutant/8") %>% 
  content()
air_pollution$exceptions
air_pollution <- rbindlist(air_pollution, fill = TRUE) 
Error in rbindlist(air_pollution, fill = TRUE) : 
  Input is data.table but should be a plain list of items to be stacked
air_pollution <- unnest(air_pollution)

How many electric vehicles are on the road across the UK?

# Reading in and skipping first 5 rows
uk_ev <- read_ods(here("raw_data/ev_by_la.ods"), sheet = 2, skip = 5)
# Making row 1 the variable name
names(uk_ev) <- uk_ev[1,] 
# Removing row 1 
uk_ev <- uk_ev[-1,] %>% 
  clean_names()
uk_shape_file <- st_read(here("raw_data/Local_Authority_Districts__April_2019__UK_BFE_v2-shp/Local_Authority_Districts__April_2019__UK_BFE_v2.shp")) 
Reading layer `Local_Authority_Districts__April_2019__UK_BFE_v2' from data source 
  `/Users/tomdavie/Documents/GitHub/ev_climate_change_project/raw_data/Local_Authority_Districts__April_2019__UK_BFE_v2-shp/Local_Authority_Districts__April_2019__UK_BFE_v2.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 382 features and 10 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -116.1928 ymin: 5333.603 xmax: 655989 ymax: 1220302
Projected CRS: OSGB 1936 / British National Grid
# Joining uk_ev + shape file 
uk_ev_map <- uk_ev %>% 
  left_join(uk_shape_file, by = c("ons_la_code_apr_2019" = "lad19cd")) %>% 
  drop_na() %>% 
  mutate(across(c(x2021_q1:x2011_q4), as.numeric)) %>% 
  st_as_sf()
    pal <- colorBin("Greens", domain = uk_ev_map$x2021_q1, bins = c(0, 500, 1000, 5000, 10000, 20000, 30000, 40000))
    
    uk_ev_map_labels <- sprintf(
      "<strong>%s</strong><br/>%g Electric Vehicles",
      uk_ev_map$region_local_authority_apr_2019_3, uk_ev_map$x2021_q1) %>% 
      lapply(htmltools::HTML)
# Geospatial of EV Vehicles in the UK 2021 Q1
uk_ev_map %>% 
  leaflet() %>% 
  setView(lng = -4.2026, lat = 55.8, zoom = 4.7, options = list()) %>%
  addProviderTiles(providers$CartoDB.Positron) %>% 
  addPolygons(fillColor = ~pal(x2021_q1),
    weight = 0.1,
    opacity = 0.9, 
    color = "black",
    fillOpacity = 0.8,
    highlightOptions = highlightOptions(color = "green", weight = 2,
                                        bringToFront = TRUE),
    label = uk_ev_map_labels,
    labelOptions = labelOptions(
      style = list("font-weight" = "normal", padding = "3px 8px"),
      textsize = "15px",
      direction = "auto")) %>% 
  addLegend(pal = pal, values = ~x2021_q1, opacity = 0.7, title = NULL,
            position = "bottomright")
# Wrangling to create an EV count over time plot 
uk_ev_longer <- uk_ev %>%
  # Pivot longer to get year and count columns
  pivot_longer(cols = c(x2021_q1:x2011_q4), names_to = c("year"), values_to = "no_of_ev") %>% 
  # Filter so we only have UK as a whole data AND we only want final numbers of the year so Q4 
  filter(region_local_authority_apr_2019_3 == "United Kingdom" & str_detect(year, "q4")) %>% 
  # Simplify to just show year
  mutate(year = case_when(str_detect(year, "2021") ~ "2021",
         str_detect(year, "2020") ~ "2020",
         str_detect(year, "2019") ~ "2019",
         str_detect(year, "2018") ~ "2018",
         str_detect(year, "2017") ~ "2017",
         str_detect(year, "2016") ~ "2016",
         str_detect(year, "2015") ~ "2015",
         str_detect(year, "2014") ~ "2014",
         str_detect(year, "2013") ~ "2013",
         str_detect(year, "2012") ~ "2012",
         str_detect(year, "2011") ~ "2011"),
         year = as.numeric(year),
         no_of_ev = as.numeric(no_of_ev))

Row binding grid NO2 data

no2_2010 <- read_csv(here("raw_data/no2_by_grid_2010.csv"), skip = 6, 
  col_names = c("uk_grid_code", "x", "y", "no2"))
Rows: 281802 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): no2
dbl (3): uk_grid_code, x, y

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
no2_2011 <- read_csv(here("raw_data/no2_by_grid_2011.csv"), skip = 6, 
  col_names = c("uk_grid_code", "x", "y", "no2"))
Rows: 281802 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): no2
dbl (3): uk_grid_code, x, y

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
no2_2012 <- read_csv(here("raw_data/no2_by_grid_2012.csv"), skip = 6, 
  col_names = c("uk_grid_code", "x", "y", "no2"))
Rows: 281802 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): no2
dbl (3): uk_grid_code, x, y

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
no2_2013 <- read_csv(here("raw_data/no2_by_grid_2013.csv"), skip = 6, 
  col_names = c("uk_grid_code", "x", "y", "no2"))
Rows: 281802 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): no2
dbl (3): uk_grid_code, x, y

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
no2_2014 <- read_csv(here("raw_data/no2_by_grid_2014.csv"), skip = 6, 
  col_names = c("uk_grid_code", "x", "y", "no2"))
Rows: 281802 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): no2
dbl (3): uk_grid_code, x, y

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
no2_2015 <- read_csv(here("raw_data/no2_by_grid_2015.csv"), skip = 6, 
  col_names = c("uk_grid_code", "x", "y", "no2"))
Rows: 281802 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): no2
dbl (3): uk_grid_code, x, y

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
no2_2016 <- read_csv(here("raw_data/no2_by_grid_2016.csv"), skip = 6, 
  col_names = c("uk_grid_code", "x", "y", "no2"))
Rows: 281802 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): no2
dbl (3): uk_grid_code, x, y

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
no2_2017 <- read_csv(here("raw_data/no2_by_grid_2017.csv"), skip = 6, 
  col_names = c("uk_grid_code", "x", "y", "no2"))
Rows: 281802 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): no2
dbl (3): uk_grid_code, x, y

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
no2_2018 <- read_csv(here("raw_data/no2_by_grid_2018.csv"), skip = 6, 
  col_names = c("uk_grid_code", "x", "y", "no2"))
Rows: 281802 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): no2
dbl (3): uk_grid_code, x, y

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
no2_2019 <- read_csv(here("raw_data/no2_by_grid_2019.csv"), skip = 6, 
  col_names = c("uk_grid_code", "x", "y", "no2"))
Rows: 281802 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): no2
dbl (3): uk_grid_code, x, y

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Create empty data frame
no2_all <- data_frame()
Warning: `data_frame()` was deprecated in tibble 1.1.0.
Please use `tibble()` instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.
# For each year, bind rows to one dataset
for (i in 2010:2019) {
  df_name <- paste0("no2_", i)
  df_input <- as.name(df_name)
  
  df <- eval(df_input) %>% 
    mutate(year = i)
  
no2_all <- bind_rows(no2_all, df)
  }
# Remove missing NO2 grid values
no2_clean <- no2_all %>% 
  filter(no2 != "MISSING")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkocmVhZE9EUykKbGlicmFyeShodHRyKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShzZikKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KGxlYWZsZXQuZXh0cmFzKQpgYGAKCmBgYHtyfQpyZWFkX29kcyhoZXJlKCJyYXdfZGF0YS9lbGVjdHJpYy12ZWhpY2xlLWNoYXJnaW5nLWRldmljZS1zdGF0aXN0aWNzLWp1bmUtMjAyMS5vZHMiKSkKYGBgCgpgYGB7cn0KZ2V0d2QoKQpgYGAKCmBgYHtyfQpBUEUgPC0gcmVhZF9vZHMoInJhd19kYXRhL0FQRV9zaXRlX2RhdGFfdGFibGVzLm9kcyIsIHNoZWV0ID0gMikKYGBgCgpgYGB7cn0KTk8yIDwtIHJlYWRfb2RzKCJyYXdfZGF0YS9OTzJfdGFibGVzLm9kcyIpCmBgYAoKYGBge3J9CnJlZ2lzdHJ5IDwtIEdFVCgiaHR0cDovL2NoYXJnZXBvaW50cy5kZnQuZ292LnVrL2FwaS9yZXRyaWV2ZS9yZWdpc3RyeS9mb3JtYXQvY3N2LyIpICU+JSAKICBjb250ZW50KCkKYGBgCgpgYGB7cn0KdHlwZSA8LSBHRVQoImh0dHA6Ly9jaGFyZ2Vwb2ludHMuZGZ0Lmdvdi51ay9hcGkvcmV0cmlldmUvdHlwZS9mb3JtYXQvY3N2LyIpICU+JSAKICBjb250ZW50KCkKYGBgCgpgYGB7cn0KcmVhZF9jc3YoIkRvY3VtZW50cy9HaXRIdWIvZXZfY2xpbWF0ZV9jaGFuZ2VfcHJvamVjdC9yYXdfZGF0YS9ubzJfYnlfZ3JpZF8yMDE5LmNzdiIpCmBgYAoKCmBgYHtyfQphaXJfcG9sbHV0aW9uX2NhcCA8LSBHRVQoImh0dHBzOi8vdWstYWlyLmRlZnJhLmdvdi51ay9kYXRhL3Nvcy9zZXJ2aWNlP3NlcnZpY2U9QVFEJnJlcXVlc3Q9R2V0Q2FwYWJpbGl0aWVzIikKYGBgCgpgYGB7cn0KYWlyX3BvbGx1dGlvbl9jYXAgPC0gcmJpbmRsaXN0KGFpcl9wb2xsdXRpb24kY29udGVudCwgZmlsbCA9IFRSVUUpCmBgYAoKYGBge3J9CmFpcl9wb2xsdXRpb25fY2FwIDwtIHVubmVzdChhaXJfcG9sbHV0aW9uX2NhcCkKYGBgCgoKYGBge3J9CmFpcl9wb2xsdXRpb24gPC0gR0VUKCJodHRwczovL3VrLWFpci5kZWZyYS5nb3YudWsvZGF0YS9zb3Mvc2VydmljZT9zZXJ2aWNlPVNPUyZ2ZXJzaW9uPTIuMC4wJnJlcXVlc3Q9R2V0T2JzZXJ2ZWQmb2JzZXJ2ZWRQcm9wZXJ0eT1odHRwOi8vZGQuZWlvbmV0LmV1cm9wYS5ldS92b2NhYnVsYXJ5L2FxL3BvbGx1dGFudC84IikgJT4lIAogIGNvbnRlbnQoKQpgYGAKCmBgYHtyfQphaXJfcG9sbHV0aW9uJGV4Y2VwdGlvbnMKYGBgCgpgYGB7cn0KYWlyX3BvbGx1dGlvbiA8LSByYmluZGxpc3QoYWlyX3BvbGx1dGlvbiRleGNlcHRpb25zLCBmaWxsID0gVFJVRSkgCmBgYAoKYGBge3J9CmFpcl9wb2xsdXRpb24gPC0gdW5uZXN0KGFpcl9wb2xsdXRpb24pCmBgYCAgIAoKIyBIb3cgbWFueSBlbGVjdHJpYyB2ZWhpY2xlcyBhcmUgb24gdGhlIHJvYWQgYWNyb3NzIHRoZSBVSz8KCmBgYHtyfQojIFJlYWRpbmcgaW4gYW5kIHNraXBwaW5nIGZpcnN0IDUgcm93cwp1a19ldiA8LSByZWFkX29kcyhoZXJlKCJyYXdfZGF0YS9ldl9ieV9sYS5vZHMiKSwgc2hlZXQgPSAyLCBza2lwID0gNSkKIyBNYWtpbmcgcm93IDEgdGhlIHZhcmlhYmxlIG5hbWUKbmFtZXModWtfZXYpIDwtIHVrX2V2WzEsXSAKIyBSZW1vdmluZyByb3cgMSAKdWtfZXYgPC0gdWtfZXZbLTEsXSAlPiUgCiAgY2xlYW5fbmFtZXMoKQpgYGAKCmBgYHtyfQojIGxvYWRpbmcgaW4gc2hhcGUgZmlsZSAKdWtfc2hhcGVfZmlsZSA8LSBzdF9yZWFkKGhlcmUoInJhd19kYXRhL0xvY2FsX0F1dGhvcml0eV9EaXN0cmljdHNfX0FwcmlsXzIwMTlfX1VLX0JGRV92Mi1zaHAvTG9jYWxfQXV0aG9yaXR5X0Rpc3RyaWN0c19fQXByaWxfMjAxOV9fVUtfQkZFX3YyLnNocCIpKSAlPiUKICBjbGVhbl9uYW1lcygpICU+JSAKICBzdF9zaW1wbGlmeShkVG9sZXJhbmNlID0gMTAwMCkgJT4lCiAgc3RfdHJhbnNmb3JtKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpICU+JSAKICBzZWxlY3QobGFkMTljZCwgbG9uZywgbGF0LCBnZW9tZXRyeSkgCmBgYAoKYGBge3J9CiMgSm9pbmluZyB1a19ldiArIHNoYXBlIGZpbGUgCnVrX2V2X21hcCA8LSB1a19ldiAlPiUgCiAgbGVmdF9qb2luKHVrX3NoYXBlX2ZpbGUsIGJ5ID0gYygib25zX2xhX2NvZGVfYXByXzIwMTkiID0gImxhZDE5Y2QiKSkgJT4lIAogIGRyb3BfbmEoKSAlPiUgCiAgbXV0YXRlKGFjcm9zcyhjKHgyMDIxX3ExOngyMDExX3E0KSwgYXMubnVtZXJpYykpICU+JSAKICBzdF9hc19zZigpCmBgYAoKCmBgYHtyfQogICAgcGFsIDwtIGNvbG9yQmluKCJHcmVlbnMiLCBkb21haW4gPSB1a19ldl9tYXAkeDIwMjFfcTEsIGJpbnMgPSBjKDAsIDUwMCwgMTAwMCwgMjUwMCwgNTAwMCwgMTAwMDAsIDE1MDAwKSkKICAgIAogICAgdWtfZXZfbWFwX2xhYmVscyA8LSBzcHJpbnRmKAogICAgICAiPHN0cm9uZz4lczwvc3Ryb25nPjxici8+JWcgRWxlY3RyaWMgVmVoaWNsZXMiLAogICAgICB1a19ldl9tYXAkcmVnaW9uX2xvY2FsX2F1dGhvcml0eV9hcHJfMjAxOV8zLCB1a19ldl9tYXAkeDIwMjFfcTEpICU+JSAKICAgICAgbGFwcGx5KGh0bWx0b29sczo6SFRNTCkKYGBgCgpgYGB7cn0KIyBHZW9zcGF0aWFsIG9mIEVWIFZlaGljbGVzIGluIHRoZSBVSyAyMDIxIFExCnVrX2V2X21hcCAlPiUgCiAgbGVhZmxldCgpICU+JSAKICBzZXRWaWV3KGxuZyA9IC00LjIwMjYsIGxhdCA9IDU1LjgsIHpvb20gPSA0LjcsIG9wdGlvbnMgPSBsaXN0KCkpICU+JQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIuUG9zaXRyb24pICU+JSAKICBhZGRQb2x5Z29ucyhmaWxsQ29sb3IgPSB+cGFsKHgyMDIxX3ExKSwKICAgIHdlaWdodCA9IDAuMSwKICAgIG9wYWNpdHkgPSAwLjksIAogICAgY29sb3IgPSAiYmxhY2siLAogICAgZmlsbE9wYWNpdHkgPSAwLjgsCiAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJncmVlbiIsIHdlaWdodCA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSwKICAgIGxhYmVsID0gdWtfZXZfbWFwX2xhYmVscywKICAgIGxhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucygKICAgICAgc3R5bGUgPSBsaXN0KCJmb250LXdlaWdodCIgPSAibm9ybWFsIiwgcGFkZGluZyA9ICIzcHggOHB4IiksCiAgICAgIHRleHRzaXplID0gIjE1cHgiLAogICAgICBkaXJlY3Rpb24gPSAiYXV0byIpKSAlPiUgCiAgYWRkTGVnZW5kKHBhbCA9IHBhbCwgdmFsdWVzID0gfngyMDIxX3ExLCBvcGFjaXR5ID0gMC43LCB0aXRsZSA9IE5VTEwsCiAgICAgICAgICAgIHBvc2l0aW9uID0gImJvdHRvbXJpZ2h0IikKYGBgCgpgYGB7cn0KIyBXcmFuZ2xpbmcgdG8gY3JlYXRlIGFuIEVWIGNvdW50IG92ZXIgdGltZSBwbG90IAp1a19ldl9sb25nZXIgPC0gdWtfZXYgJT4lCiAgIyBQaXZvdCBsb25nZXIgdG8gZ2V0IHllYXIgYW5kIGNvdW50IGNvbHVtbnMKICBwaXZvdF9sb25nZXIoY29scyA9IGMoeDIwMjFfcTE6eDIwMTFfcTQpLCBuYW1lc190byA9IGMoInllYXIiKSwgdmFsdWVzX3RvID0gIm5vX29mX2V2IikgJT4lIAogICMgRmlsdGVyIHNvIHdlIG9ubHkgaGF2ZSBVSyBhcyBhIHdob2xlIGRhdGEgQU5EIHdlIG9ubHkgd2FudCBmaW5hbCBudW1iZXJzIG9mIHRoZSB5ZWFyIHNvIFE0IAogIGZpbHRlcihyZWdpb25fbG9jYWxfYXV0aG9yaXR5X2Fwcl8yMDE5XzMgPT0gIlVuaXRlZCBLaW5nZG9tIiAmIHN0cl9kZXRlY3QoeWVhciwgInE0IikpICU+JSAKICAjIFNpbXBsaWZ5IHRvIGp1c3Qgc2hvdyB5ZWFyCiAgbXV0YXRlKHllYXIgPSBjYXNlX3doZW4oc3RyX2RldGVjdCh5ZWFyLCAiMjAyMSIpIH4gIjIwMjEiLAogICAgICAgICBzdHJfZGV0ZWN0KHllYXIsICIyMDIwIikgfiAiMjAyMCIsCiAgICAgICAgIHN0cl9kZXRlY3QoeWVhciwgIjIwMTkiKSB+ICIyMDE5IiwKICAgICAgICAgc3RyX2RldGVjdCh5ZWFyLCAiMjAxOCIpIH4gIjIwMTgiLAogICAgICAgICBzdHJfZGV0ZWN0KHllYXIsICIyMDE3IikgfiAiMjAxNyIsCiAgICAgICAgIHN0cl9kZXRlY3QoeWVhciwgIjIwMTYiKSB+ICIyMDE2IiwKICAgICAgICAgc3RyX2RldGVjdCh5ZWFyLCAiMjAxNSIpIH4gIjIwMTUiLAogICAgICAgICBzdHJfZGV0ZWN0KHllYXIsICIyMDE0IikgfiAiMjAxNCIsCiAgICAgICAgIHN0cl9kZXRlY3QoeWVhciwgIjIwMTMiKSB+ICIyMDEzIiwKICAgICAgICAgc3RyX2RldGVjdCh5ZWFyLCAiMjAxMiIpIH4gIjIwMTIiLAogICAgICAgICBzdHJfZGV0ZWN0KHllYXIsICIyMDExIikgfiAiMjAxMSIpLAogICAgICAgICB5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSwKICAgICAgICAgbm9fb2ZfZXYgPSBhcy5udW1lcmljKG5vX29mX2V2KSkKYGBgCgoKYGBge3J9CnVrX2V2X2xvbmdlciAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0geWVhciwgeSA9IG5vX29mX2V2KSArCiAgZ2VvbV9jb2woZmlsbCA9ICJsYXduZ3JlZW4iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoMjAxMToyMDIwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjIwMDAwLCBieSA9IDIwMDAwKSwgbGltaXRzID0gYygwLCAyMjAwMDApKSArCiAgbGFicyh0aXRsZSA9ICJcbk51bWJlciBvZiBFbGVjdHJpYyBWZWhpY2xlcyBvdmVyIHRpbWUgaW4gdGhlIFVLXG4iLAogICAgICAgeCA9ICJcblllYXJcbiIsCiAgICAgICB5ID0gIlxuTnVtYmVyIG9mIEVsZWN0cmljIFZlaGljbGVzXG4iKSArCiAgdGhlbWVfbWluaW1hbCgpIApgYGAKCiAgCgoKIyBSb3cgYmluZGluZyBncmlkIE5PMiBkYXRhIAoKYGBge3J9Cm5vMl8yMDEwIDwtIHJlYWRfY3N2KGhlcmUoInJhd19kYXRhL25vMl9ieV9ncmlkXzIwMTAuY3N2IiksIHNraXAgPSA2LCAKICBjb2xfbmFtZXMgPSBjKCJ1a19ncmlkX2NvZGUiLCAieCIsICJ5IiwgIm5vMiIpKQpubzJfMjAxMSA8LSByZWFkX2NzdihoZXJlKCJyYXdfZGF0YS9ubzJfYnlfZ3JpZF8yMDExLmNzdiIpLCBza2lwID0gNiwgCiAgY29sX25hbWVzID0gYygidWtfZ3JpZF9jb2RlIiwgIngiLCAieSIsICJubzIiKSkKbm8yXzIwMTIgPC0gcmVhZF9jc3YoaGVyZSgicmF3X2RhdGEvbm8yX2J5X2dyaWRfMjAxMi5jc3YiKSwgc2tpcCA9IDYsIAogIGNvbF9uYW1lcyA9IGMoInVrX2dyaWRfY29kZSIsICJ4IiwgInkiLCAibm8yIikpCm5vMl8yMDEzIDwtIHJlYWRfY3N2KGhlcmUoInJhd19kYXRhL25vMl9ieV9ncmlkXzIwMTMuY3N2IiksIHNraXAgPSA2LCAKICBjb2xfbmFtZXMgPSBjKCJ1a19ncmlkX2NvZGUiLCAieCIsICJ5IiwgIm5vMiIpKQpubzJfMjAxNCA8LSByZWFkX2NzdihoZXJlKCJyYXdfZGF0YS9ubzJfYnlfZ3JpZF8yMDE0LmNzdiIpLCBza2lwID0gNiwgCiAgY29sX25hbWVzID0gYygidWtfZ3JpZF9jb2RlIiwgIngiLCAieSIsICJubzIiKSkKbm8yXzIwMTUgPC0gcmVhZF9jc3YoaGVyZSgicmF3X2RhdGEvbm8yX2J5X2dyaWRfMjAxNS5jc3YiKSwgc2tpcCA9IDYsIAogIGNvbF9uYW1lcyA9IGMoInVrX2dyaWRfY29kZSIsICJ4IiwgInkiLCAibm8yIikpCm5vMl8yMDE2IDwtIHJlYWRfY3N2KGhlcmUoInJhd19kYXRhL25vMl9ieV9ncmlkXzIwMTYuY3N2IiksIHNraXAgPSA2LCAKICBjb2xfbmFtZXMgPSBjKCJ1a19ncmlkX2NvZGUiLCAieCIsICJ5IiwgIm5vMiIpKQpubzJfMjAxNyA8LSByZWFkX2NzdihoZXJlKCJyYXdfZGF0YS9ubzJfYnlfZ3JpZF8yMDE3LmNzdiIpLCBza2lwID0gNiwgCiAgY29sX25hbWVzID0gYygidWtfZ3JpZF9jb2RlIiwgIngiLCAieSIsICJubzIiKSkKbm8yXzIwMTggPC0gcmVhZF9jc3YoaGVyZSgicmF3X2RhdGEvbm8yX2J5X2dyaWRfMjAxOC5jc3YiKSwgc2tpcCA9IDYsIAogIGNvbF9uYW1lcyA9IGMoInVrX2dyaWRfY29kZSIsICJ4IiwgInkiLCAibm8yIikpCm5vMl8yMDE5IDwtIHJlYWRfY3N2KGhlcmUoInJhd19kYXRhL25vMl9ieV9ncmlkXzIwMTkuY3N2IiksIHNraXAgPSA2LCAKICBjb2xfbmFtZXMgPSBjKCJ1a19ncmlkX2NvZGUiLCAieCIsICJ5IiwgIm5vMiIpKQoKIyBDcmVhdGUgZW1wdHkgZGF0YSBmcmFtZQpubzJfYWxsIDwtIGRhdGFfZnJhbWUoKQoKIyBGb3IgZWFjaCB5ZWFyLCBiaW5kIHJvd3MgdG8gb25lIGRhdGFzZXQKZm9yIChpIGluIDIwMTA6MjAxOSkgewogIGRmX25hbWUgPC0gcGFzdGUwKCJubzJfIiwgaSkKICBkZl9pbnB1dCA8LSBhcy5uYW1lKGRmX25hbWUpCiAgCiAgZGYgPC0gZXZhbChkZl9pbnB1dCkgJT4lIAogICAgbXV0YXRlKHllYXIgPSBpKQogIApubzJfYWxsIDwtIGJpbmRfcm93cyhubzJfYWxsLCBkZikKICB9CmBgYAoKYGBge3J9CiMgUmVtb3ZlIG1pc3NpbmcgTk8yIGdyaWQgdmFsdWVzCm5vMl9jbGVhbiA8LSBubzJfYWxsICU+JSAKICBmaWx0ZXIobm8yICE9ICJNSVNTSU5HIikKYGBgCgpgYGB7cn0KbGlicmFyeShwcm9qNCkKcHJvajRzdHJpbmcgPC0gIitwcm9qPXRtZXJjICtsYXRfMD00OSArbG9uXzA9LTIgK2s9MC45OTk2MDEyNzE3ICt4XzA9NDAwMDAwICt5XzA9LTEwMDAwMCArZWxscHM9YWlyeSArZGF0dW09T1NHQjM2ICt1bml0cz1tICtub19kZWZzIgoKbm8yX2NsZWFuX3JvdyA8LSBubzJfY2xlYW4gJT4lIAogIHJvd2lkX3RvX2NvbHVtbigpCgojIFNvdXJjZSBkYXRhCnh5IDwtIG5vMl9jbGVhbl9yb3cgJT4lIAogIHNlbGVjdCh4LCB5LCByb3dpZCkKCiMgVHJhbnNmb3JtZWQgZGF0YQpwaiA8LSBwcm9qZWN0KHh5LCBwcm9qNHN0cmluZywgaW52ZXJzZT1UUlVFKQpsYXRsb24gPC0gZGF0YS5mcmFtZSh4eSwgbGF0PXBqJHksIGxvbj1waiR4KQpmaW5hbCA8LSAgbWVyZ2Uobm8yX2NsZWFuX3JvdywgbGF0bG9uLCBieS54ID0gInJvd2lkIiwgYnkueSA9ICJyb3dpZCIpICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JSAKICBzZWxlY3QobGF0LCBsb24sIG5vMikKICAKYGBgCgpgYGB7cn0KbGVhZmxldCgpICU+JQogIGFkZFByb3ZpZGVyVGlsZXMoIkNhcnRvREIuUG9zaXRyb24iLCBvcHRpb25zID0gcHJvdmlkZXJUaWxlT3B0aW9ucyhub1dyYXAgPSBUUlVFKSkgJT4lCiAgc2V0VmlldyhsbmcgPSAtNC4yMDI2LCBsYXQgPSA1NS44LCB6b29tID0gNC43LCBvcHRpb25zID0gbGlzdCgpKSAlPiUKICBhZGRIZWF0bWFwKGRhdGEgPSBmaW5hbCwKICAgICAgICAgICAgIGxuZyA9IH5sb24sIAogICAgICAgICAgICAgbGF0ID0gfmxhdCwgCiAgICAgICAgICAgICBpbnRlbnNpdHkgPSB+bm8yLAogICAgICAgICAgICAgbWluT3BhY2l0eSA9IDAuMDUsCiAgICAgICAgICAgICBtYXggPSA1LAogICAgICAgICAgICAgcmFkaXVzID0gNykKYGBg